#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;
/*HJJ QQ479287006
 *给定一个字符串 s ，通过将字符串 s 中的每个字母转变大小写，我们可以获得一个新的字符串。

返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。

 

示例 1：

输入：s = "a1b2"
输出：["a1b2", "a1B2", "A1b2", "A1B2"]
示例 2:

输入: s = "3z4"
输出: ["3z4","3Z4"]

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/letter-case-permutation
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */
vector<string> ret;
string temp;

void letterCasePermutationBack(string s, int startIndex) {
    ret.push_back(temp);
    for (int i = startIndex; i < s.size(); ++i) {
        if (temp[i] >= '0' && temp[i] <= '9')
            continue;
        if (temp[i] >= 'a' && temp[i] <= 'z') {
            temp[i] = temp[i] - 32;
            letterCasePermutationBack(s, i + 1);
            temp[i] = temp[i] + 32;
        } else {
            temp[i] = temp[i] + 32;
            letterCasePermutationBack(s, i + 1);
            temp[i] = temp[i] - 32;
        }
    }

}

vector<string> letterCasePermutation(string s) {
    temp = s;
    letterCasePermutationBack(s, 0);
    return ret;

}